package controllers.vecino;

import java.util.ArrayList;
import java.util.Collection;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import services.ComunidadDeVecinosService;
import services.IncidenciaService;
import services.PresupuestoService;
import controllers.AbstractController;
import domain.Incidencia;
import domain.Presupuesto;

@Controller
@RequestMapping("/incidencia/vecino")
public class IncidenciaVecinoController extends AbstractController {
	@Autowired
	private IncidenciaService incidenciaService;
	@Autowired
	private PresupuestoService presupuestoService;
	@Autowired
	private ComunidadDeVecinosService comunidadDeVecinosService;

	public IncidenciaVecinoController() {
		super();
	}

	// List
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public ModelAndView list(@RequestParam int comunidadId) {
		ModelAndView result;
		Collection<Incidencia> incidencias;
		Boolean isPresident;

		isPresident = comunidadDeVecinosService.isPresidente(comunidadId);
		incidencias = incidenciaService.findByComunidad(comunidadId);

		result = new ModelAndView("incidencia/list");
		result.addObject("isPresident", isPresident);
		result.addObject("incidencias", incidencias);
		result.addObject("comunidadId", comunidadId);
		result.addObject("requestURI", "incidencia/vecino/list.do");
		result.addObject("backURI", "/comunidad/vecino/edit.do?comunidadId="
				+ comunidadId);

		return result;

	}

	// Creation
	@RequestMapping(value = "/create", method = RequestMethod.GET)
	public ModelAndView create(@RequestParam int comunidadId) {
		ModelAndView result;
		Incidencia incidencia;
		Boolean isPresident;
		Boolean isNew;

		isPresident = comunidadDeVecinosService.isPresidente(comunidadId);
		incidencia = incidenciaService.create(comunidadId);
		isNew = true;

		result = new ModelAndView("incidencia/create");
		result.addObject("isPresident", isPresident);
		result.addObject("incidencia", incidencia);
		result.addObject("requestURI", "incidencia/vecino/create.do");
		result.addObject("backURI", "/incidencia/vecino/list.do?comunidadId="
				+ comunidadId);
		result.addObject("isNew", isNew);

		return result;

	}

	@RequestMapping(value = "/edit", method = RequestMethod.GET)
	public ModelAndView edit(@RequestParam int incidenciaId) {
		ModelAndView result;
		Incidencia incidencia;
		Boolean isPresident;
		Boolean isNew;
		Collection<Presupuesto> presupuestos;

		incidencia = incidenciaService.findOne(incidenciaId);
		isPresident = comunidadDeVecinosService.isPresidente(incidencia
				.getComunidadDeVecinos().getId());
		presupuestos = presupuestoService.findPresupuestosServicioNoAceptado();
		isNew = false;

		result = new ModelAndView("incidencia/details");
		result.addObject("isPresident", isPresident);
		result.addObject("incidencia", incidencia);
		result.addObject("presupuestos", presupuestos);
		result.addObject("requestURI",
				"incidencia/vecino/edit.do?incidenciaId=" + incidenciaId);
		result.addObject("backURI", "/incidencia/vecino/list.do?comunidadId="
				+ incidencia.getComunidadDeVecinos().getId());
		result.addObject("isNew", isNew);

		return result;

	}

	@RequestMapping(value = "/create", method = RequestMethod.POST, params = "save")
	public ModelAndView save(@Valid Incidencia incidencia, BindingResult binding) {
		ModelAndView result;

		if (binding.hasErrors()) {
			result = createEditModelAndView(incidencia);
		} else {
			try {
				incidenciaService.save(incidencia);
				result = new ModelAndView(
						"redirect:/incidencia/vecino/list.do?comunidadId="
								+ incidencia.getComunidadDeVecinos().getId());

			} catch (Throwable oops) {

				result = createEditModelAndView(incidencia,
						"incidencia.commit.error");
			}
		}

		return result;
	}

	@RequestMapping(value = "/asignaPresupuesto.do", method = RequestMethod.GET)
	public ModelAndView save(@RequestParam int incidenciaId, int presupuestoId) {
		ModelAndView result;
		Incidencia incidencia;
		incidencia = incidenciaService.findOne(incidenciaId);

		try {
			incidenciaService.asignarPresupuesto(incidencia, presupuestoId);
			incidenciaService.save(incidencia);
			result = new ModelAndView(
					"redirect:/incidencia/vecino/list.do?comunidadId="
							+ incidencia.getComunidadDeVecinos().getId());

		} catch (Throwable oops) {
			incidencia.setEstado("Pendiente de presupuesto");
			incidencia.setPresupuestos(new ArrayList<Presupuesto>());
			result = createEditModelAndView(incidencia,
					"incidencia.asignarPresupuesto.error");
		}

		return result;
	}

	// Ancillary methods
	protected ModelAndView createEditModelAndView(Incidencia incidencia) {
		ModelAndView result;

		result = createEditModelAndView(incidencia, null);

		return result;
	}

	protected ModelAndView createEditModelAndView(Incidencia incidencia,
			String message) {
		ModelAndView result;
		Boolean isNew;
		Boolean isPresident;
		Collection<Presupuesto> presupuestos;

		if (incidencia.getId() == 0) {

			isNew = true;

			result = new ModelAndView("incidencia/create");
			result.addObject("requestURI", "incidencia/vecino/create.do");

		} else {
			result = new ModelAndView("incidencia/details");
			result.addObject("requestURI", "incidencia/vecino/edit.do");
			isNew = false;

		}

		isPresident = comunidadDeVecinosService.isPresidente(incidencia
				.getComunidadDeVecinos().getId());
		presupuestos = presupuestoService.findPresupuestoServicioAsytec();

		result.addObject("isPresident", isPresident);
		result.addObject("incidencia", incidencia);
		result.addObject("presupuestos", presupuestos);
		result.addObject("backURI", "/incidencia/vecino/list.do?comunidadId="
				+ incidencia.getComunidadDeVecinos().getId());
		result.addObject("isNew", isNew);
		result.addObject("message", message);

		return result;
	}
}